const Question = require('../models/questions')
class QuestionCtl {
    // 查询问题
    async find(ctx) {
        const { per_page = 2 } = ctx.query
        const page = Math.max(ctx.query.page * 1, 1) - 1 // 第几页
        const perPage = Math.max(per_page * 1, 1) // 每页有几条
        // skip 跳过前面的n条数据
        ctx.body = await Question
            .find({ $or: [{ title: new RegExp(ctx.query.q) }, { description: new RegExp(ctx.query.q) }] })
            .limit(perPage)
            .skip(page * perPage)
    }
    // 查询特定问题
    async findById(ctx) {
        const { fields = '' } = ctx.query
        const selectFields = fields.split(';').filter(f => f).map(f => '+' + f).join(' ')
        const question = await Question.findById(ctx.params.id).select(selectFields).populate('questioner')
        ctx.body = question
    }
    // 新建问题
    async create(ctx) {
        ctx.verifyParams({
            title: { type: 'string', required: true },
            description: { type: 'string', required: false },
        })
        const question = await new Question({ ...ctx.request.body, questioner: ctx.state.user._id }).save()
        ctx.body = question
    }
    // 修改问题
    async update2(ctx) {
        ctx.verifyParams({
            title: { type: 'string', required: false },
            description: { type: 'string', required: false },
        })
        // 方法不可以用
        await ctx.state.question.update(ctx.request.body)
        ctx.body = ctx.state.question
    }
    async update(ctx) {
        ctx.verifyParams({
            title: { type: 'string', required: false },
            description: { type: 'string', required: false },
        })
        const question = await Question.findByIdAndUpdate(ctx.params.id, ctx.request.body)
        ctx.body = question
    }
    // 检查问题是否存在
    async checkQuestionExist(ctx, next) {
        const question = await Question.findById(ctx.params.id).select('+questioner')
        if (!question) { ctx.throw(404, '问题不存在') }
        // 与update共用findById
        ctx.state.question = question
        await next()
    }
    // 检查当前登录者是否是提出该问题的人
    async checkQuestioner(ctx, next) {
        const { question } = ctx.state
        if (question.questioner.toString() !== ctx.state.user._id) {
            ctx.throw(403, '没有权限')
        }
        await next()
    }
    async delete(ctx) {
        await Question.findByIdAndRemove(ctx.params.id)
        ctx.status = 204
    }
}

module.exports = new QuestionCtl()
